package function接口;

import java.util.function.Predicate;

/**
 * @author : ZhuQi
 * @version : 时间:2022/9/5 22:58 版本:
 * @description : 测试 Predicate 断言式接口
 */
public class PredicateDemo {

    public static void main(String[] args) {

        // 1：false，2：true
        boolean b1 = checkString("hello", s -> s.length() > 8);
        System.out.println(b1);

        // 3:false,4:true
        boolean b2 = checkString("hello",s->s.length()>8,s -> s.length()<15);
        System.out.println(b2);

        // 3:true,4:true
        boolean b3 = checkString("hellojava",s->s.length()>8,s -> s.length()<15);
        System.out.println(b3);
    }

    // 判断给定的字符串是否满足要求
    private static boolean checkString(String s, Predicate<String> pre) {
        // 1,boolean test(T t) 	对给定的参数进行判断(判断逻辑由Lambda表达式实现，返回一个布尔值
        //  return pre.test(s);
        // return !pre.test(s);
        // 输出相反的，不过用下一个方法

        // 2,default Predicate<T> negate() 	返回一个逻辑的否定，对应逻辑非
        return pre.negate().test(s);
    }

    // 同一个结果给出两个不同的判断条件，最后把这两个判断结果做逻辑与的结果作为最终结果
    private static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
        // boolean b1 = pre1.test(s);
        // boolean b2 = pre2.test(s);
        // boolean b = b1 && b2;
        // return b;

        // 3,default Predicate <T> and(Predicate other) 	返回一个组合判断，对应短路与
        // return pre1.and(pre2).test(s);
        // 源码：return (t) -> test(t) && other.test(t);

        // default Predicate <T> or(Predicate other) 	返回一个组合判断，对应短路或
        // 源码：return (t) -> test(t) || other.test(t);
        return pre1.or(pre2).test(s);
    }
}
